import router from './router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { Message } from 'element-ui'
import { Route } from 'vue-router'
import { UserModule } from '@/store/modules/user'
import { PermissionModule } from '@/store/modules/permission'
import i18n from '@/lang' // Internationalization
import settings from './settings'

// 官方英文解释，进度环显示隐藏
// Turn off loading spinner by setting it to false. (default: true)
NProgress.configure({ showSpinner: false })

// 白名单
const whiteList = ['/login', '/auth-redirect']

// todo 需要研究
const getPageTitle = (key: string) => {
  const hasKey = i18n.te(`route.${key}`)
  if (hasKey) {
    const pageName = i18n.t(`route.${key}`)
    return `${pageName} - ${settings.title}`
  }
  return `${settings.title}`
}

router.beforeEach(async (to: Route, _: Route, next: any) => {
  // Start progress bar
  NProgress.start()

  // // 如果用户访问的登录页，直接放行
  // if (to.path === '/login') {
  //   NProgress.done()
  //   return next();
  // }
  // // 从 sessionStorage 中获取保存的 token 值
  // const tokenStr = window.sessionStorage.getItem('token');
  // // 没有 token，强制跳转到登录页
  // if (!tokenStr) {
  //   NProgress.done()
  //   return next('/login')
  // }
  // next();
  // NProgress.done()

  if (UserModule.token) {
    if (to.path === '/login') {
      // 如果已登录，则重定向到主页
      next({ path: '/' })
      NProgress.done()
    } else {
      // 检查用户是否已获取相应的权限角色
      if (UserModule.roles.length === 0) {
        try {
          // Note: 角色必须是一个对象数组!如: ['admin'] or ['developer', 'editor']
          await UserModule.GetUserInfo()
          const roles = UserModule.roles
          // 基于角色生成可访问路由图
          PermissionModule.GenerateRoutes(roles)
          // 动态添加可访问的路由
          PermissionModule.dynamicRoutes.forEach(route => {
            router.addRoute(route)
          })
          // Hack: 确保地址路由是完整的
          // 设置replace: true，这样导航就不会留下历史记录
          next({ ...to, replace: true })
        } catch (err) {
          // 删除token并重定向到登录页面
          UserModule.ResetToken()
          Message.error(err || 'Has Error')
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      } else {
        next()
      }
    }
  } else {
    // 没有 token
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免费登录白名单，直接去
      next()
    } else {
      // 其他没有访问权限的页面被重定向到登录页面。.
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

router.afterEach((to: Route) => {
  // Finish progress bar
  // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939
  NProgress.done()

  // 设置页面标题
  document.title = getPageTitle(to.meta.title)
})
